package com.itheima.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.itheima.dao.MenuDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.pojo.Menu;
import com.itheima.pojo.Role;
import com.itheima.utils.GetRowsConditionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author ${小帅帅}
 * @date 2019-11-01
 * 菜单服务
 */
@Service(interfaceClass = MenuService.class)
@Transactional
public class MenuServiceImpl implements MenuService {

    @Autowired
    private MenuDao menuDao;

    /**
     * 查询菜单
     *
     * @return
     */
    @Override
    public List<Menu> getAllMenu() {
        return menuDao.getAllMenu();
    }

    //菜单分页查询
    @Override
    public PageResult findPage(QueryPageBean pageBean) throws Exception {
        //获取分页条件
        String condition = GetRowsConditionUtils.getCondition(pageBean);

        //持久层：菜单分页查询调用
        Page<Menu> page = menuDao.findPage(condition);

        //获取总记录数
        long total = page.getTotal();

        //获取当前页的显示结果
        List<Menu> rows = page.getResult();

        //传递参数，并返回
        return new PageResult(total, rows);
    }

    //编辑菜单时，基本信息的回显
    @Override
    public Menu backBaseInfor(Integer id) {
        //持久层：基本信息回显的调用
        Menu menu = menuDao.backBaseInfor(id);
        return menu;
    }


    //编辑菜单时，角色的回显
    @Override
    public List<Integer> findRoles(Integer id) {
        //持久层：角色的回显
        List<Integer> list = menuDao.findRoles(id);
        return list;
    }


    //删除菜单
    @Override
    public void deleteMenuById(Integer id) {
        //查询菜单和角色的关联关系
        long count = menuDao.countById(id);
        if (count > 0) {
            //当前菜单已经被关联到角色，不允许删除
            new RuntimeException();
        }

        //删除菜单
        menuDao.deleteById(id);
    }

    //新增菜单时，查询所有角色信息
    @Override
    public List<Role> findAll() {

        //查询所有角色信息的调用
        List<Role> roles = menuDao.findAll();
        return roles;
    }


    //新增菜单
    @Override
    public void add(Menu menu, Integer[] roleIds) {


        //分别来操作：保存检查组、存储检查组和检查项的ID

        //调用存储菜单基本信息的方法，这里不需要返回值
        menuDao.addMenu(menu);

        //获取菜单的主键ID（因为SQL语句的处理，这里可以直接获取到ID）
        Integer menuIds = menu.getId();

        //建立检查组和检查项的关联关系，即：存储二者的ID，因为只有添加了关联关系，才能根据ID找到检查项
        setCheckGroupAndCheckItem(menuIds, roleIds);

    }


    //保存编辑的菜单
    @Override
    public void edit(Menu menu, Integer[] roleIds) {

        //根据菜单的ID，清除中间表中原角色的关联信息
        menuDao.deleteCenter(menu.getId());

        //保存修改菜单的基本信息
        menuDao.addMenu(menu);

        //获取菜单的主键ID（因为SQL语句的处理，这里可以直接获取到ID）
        Integer menuIds = menu.getId();

        //重新建立关联关系：
        setCheckGroupAndCheckItem(menuIds, roleIds);

    }


    //抽取方法：菜单和角色的中间表关系，即：存储二者的ID
    public void setCheckGroupAndCheckItem(Integer menuIds, Integer[] roleIds) {


        //遍历roleIds，拿到角色的ID
        if (roleIds != null && roleIds.length > 0) {

            for (Integer Ids : roleIds) {

                //使用Map集合，进行存储二者的ID
                Map<String, Integer> map = new HashMap<>();
                map.put("menu_id", menuIds);
                map.put("role_id", Ids);

                //调用存储中间表的方法：设置菜单和角色的关联关系。即：保存两个的ID，因为只有添加了关联关系，才能根据ID找到角色
                menuDao.saveID(map);
            }
        }
    }
}














